package com.showmaker.controller;

import com.showmaker.bean.Order;
import com.showmaker.constant.MessageConstant;
import com.showmaker.constant.RedisMessageConstant;
import com.showmaker.entity.Result;
import com.showmaker.service.OrderService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * 体检预约处理
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @DubboReference(interfaceClass = OrderService.class, version = "1.0")
    private OrderService orderService;

    /**
     * 体检预约
     * @return 返回预约处理的结果
     */
    @PostMapping("/submit")
    public Result submit(@RequestBody Map map) {
        // 从提交的参数中获取验证码
        String validateCode = (String) map.get("validateCode");
        // 从 Redis 中获取缓存的验证码
        ValueOperations operations = redisTemplate.opsForValue();
        String validateCodeInRedis = (String) operations.get(map.get("telephone") + RedisMessageConstant.SENDTYPE_ORDER);

        if (validateCode != null && validateCodeInRedis != null && validateCodeInRedis.equals(validateCode)) {
            // 验证码验证成功执行的逻辑
            // 设置预约的类型
            map.put("orderType", Order.ORDERTYPE_WEIXIN);
            // 调用方法进行预约，并返回预约的结果
            Result result = null;
            // 通过 Dubbo 远程调用服务，为了保证服务正常被调用，将调用过程放在 try catch 语句中
            try {
                result = orderService.order(map);
            } catch (Exception e) {
                e.printStackTrace();
                // 在 service 服务中，会返回一个 result 对象，其中就包含有调用的相关信息
                return result;
            }
            // 如果 isFlag 的值是 true，说明预约成功，将通过短信通知用户预约成功
            // 这里就直接模拟发送短信的过程
            if (result.isFlag()) {
                System.out.println("手机提示信息【用户：" + map.get("name") + " 手机号：" + map.get("telephone") + " 预约体检成功！" +
                        "预约时间：" + map.get("orderDate") + "】");
            }
            return result;
        } else {
            // 如果输入的验证码错误，直接返回
            return new Result(false, MessageConstant.VALIDATECODE_ERROR);
        }
    }

    /**
     * 体检预约的详情页面
     * @param id 预约记录的id(t_order表的id字段的值)
     * @return 返回指定数据的详细信息
     */
    @GetMapping("/{id}")
    public Result getOrder(@PathVariable Integer id) {
        try {
            Map<String, Object> map = orderService.selectOrderDetailById(id);
            return new Result(true, MessageConstant.QUERY_ORDER_SUCCESS, map);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.QUERY_ORDER_FAIL);
        }
    }
}
